#include<iostream>
#include<algorithm>
using namespace std;
int a[100],b[100],dp[100][100];
void print(int i,int j)
{
    if(i<1||j<1||dp[i][j]==0) return;
    if(a[i]==b[j])
    {
        print(i-1,j-1);
        cout<<a[i];
    }
    else if(dp[i][j]==dp[i-1][j])
    print(i-1,j);
    else print(i,j-1);
}
int main()
{
    int n,m;cin>>m>>n;
    for(int i=1;i<=m;i++)
    cin>>a[i];
    for(int i=1;i<=n;i++)
    cin>>b[i];
    for(int i=1;i<=m;i++)
    {
        for(int j=1;j<=n;j++)
        {
            if(a[i]==b[j])
            dp[i][j]=dp[i-1][j-1]+1;
            else dp[i][j]=max(dp[i-1][j],dp[i][j-1]);
        }
    }
    cout<<dp[m][n]<<endl;
    print(m,n);
}

//最长回文子序列
// #include<iostream>
// #include<algorithm>
// using namespace std;
// char a[100],b[100];int dp[100][100];
// void print(int i,int j)
// {
//     if(i<1||j<1||dp[i][j]==0) return;
//     if(a[i]==b[j])
//     {
//         print(i-1,j-1);
//         cout<<a[i];
//     }
//     else if(dp[i][j]==dp[i-1][j])
//     print(i-1,j);
//     else print(i,j-1);
// }
// int main()
// {
//     int n,m;cin>>m>>n;
//     for(int i=1;i<=m;i++)
//     cin>>a[i];
//     for(int i=1;i<=n;i++)
//     b[i]=a[n-i-1];
//     for(int i=1;i<=m;i++)
//     {
//         for(int j=1;j<=n;j++)
//         {
//             if(a[i]==b[j])
//             dp[i][j]=dp[i-1][j-1]+1;
//             else dp[i][j]=max(dp[i-1][j],dp[i][j-1]);
//         }
//     }
//     cout<<dp[m][n]<<endl;
//     print(m,n);
// }